package smallfrench.moteur.noeuds;

import smallfrench.moteur.interp.Portee;
import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.lexer.err.ErreurLexer;
import smallfrench.moteur.lexer.lexemes.Lexeme;
import smallfrench.moteur.parser.ExceptionNonAssignable;

/**
 * Opérateur d’assignation '='
 * @author antoine1023
 *
 */
public class NAssign extends Noeud {

	private final Noeud noeudGauche;
	private final Noeud noeudDroite;

	public NAssign(Lexeme t, Noeud noeudGauche, Noeud noeudDroite)
			throws ErreurLexer {

		super(t);
		this.noeudGauche = noeudGauche;
		this.noeudDroite = noeudDroite;
		if (! (noeudGauche instanceof Assignable)) {
			throw new ExceptionNonAssignable(noeudGauche.lexeme.debut);
		}

	}

	@Override
	public RObjet evaluer(Portee portee) {
		RObjet nouvValeur = noeudDroite.evaluer(portee);
		((Assignable)noeudGauche).assigner(nouvValeur, portee);
		return nouvValeur;
	}

	@Override
	public String toString() {
		return noeudGauche + " = " + noeudDroite;
	}

}
